﻿#include <iostream>
#include<thread>

using namespace std;

struct MyStruct
{
    int a = 0;
    string s = "abc雷";
};

//线程入口
void proc(MyStruct& a)
{
    for (int m = 0; m < 50; m++)
    {
        if (a.a == 0)
        {
            cout << "线程中断" << endl;
            break;

        }

        std::chrono::milliseconds sd(1000);
        this_thread::sleep_for(sd);
        cout << "我是子线程,传入参数为" << a.a << a.s << endl;
        cout << "子线程中显示子线程id为" << this_thread::get_id() << endl;
    }
    //函数执行完，线程停止
}

int main()
{
    MyStruct my;
    my.a = 20;
    my.s = "aa雷";

    //thread th2(proc, &my);  //传递引用时要用ref才可，用&会失败，不了解这个<br>     //thread th2(&proc, ref(my)); //线程入口加个&执行也没问题

    //也可用thread *t=new 创建，但需要delete
    //如果线程入口是成员函数，需要这样（加个this参数）： this->th2 = new thread(&MySerialPort::读线程入口, this, 等待毫秒);
    thread th2(proc, ref(my));//第一个参数为函数名，第二个参数为该函数的第一个参数，如果该函数接收多个参数就依次写在后面。此时线程开始执行。
    cout << "主线程中显示子线程id为" << th2.get_id() << endl;
    //此处省略多行，不要在创建完线程后马上join,应该在程序结束前join

    this_thread::sleep_for(std::chrono::milliseconds(2000));  //主线程休眠2s
    my.a = 0;  //触发子线程停止
    th2.join();//此时主线程被阻塞直至子线程执行结束。


    std::cout << "Hello World!\n";
}

// 运行程序: Ctrl + F5 或调试 >“开始执行(不调试)”菜单
// 调试程序: F5 或调试 >“开始调试”菜单

// 入门使用技巧: 
//   1. 使用解决方案资源管理器窗口添加/管理文件
//   2. 使用团队资源管理器窗口连接到源代码管理
//   3. 使用输出窗口查看生成输出和其他消息
//   4. 使用错误列表窗口查看错误
//   5. 转到“项目”>“添加新项”以创建新的代码文件，或转到“项目”>“添加现有项”以将现有代码文件添加到项目
//   6. 将来，若要再次打开此项目，请转到“文件”>“打开”>“项目”并选择 .sln 文件
